<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:cfd="http://www.sat.gob.mx/cfd/2" xmlns:ecc="http://www.sat.gob.mx/ecc" xmlns:psgecfd="http://www.sat.gob.mx/psgecfd">
	<!-- Con el siguiente método se establece que la salida deberá ser en texto -->
	<!-- <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> -->
	<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
	<!--
		En esta sección se define la inclusión de las plantillas de utilería
	-->
	<xsl:include href="http://www.sat.gob.mx/sitio_internet/cfd/2/cadenaoriginal_2_0/utilerias.xslt"/>
	<!-- 
		En esta sección se define la inclusión de las demás plantillas de transformación para 
		la generación de las cadenas originales de los complementos fiscales 
	-->
	<xsl:include href="http://www.sat.gob.mx/sitio_internet/cfd/ecc/ecc.xslt"/>
	<xsl:include href="http://www.sat.gob.mx/sitio_internet/cfd/psgecfd/psgecfd.xslt"/>
	<xsl:include href="http://www.sat.gob.mx/sitio_internet/cfd/donat/donat.xslt"/>
	<!--
	<xsl:include href="divat.xslt"/>
	-->
	<!-- Aquí iniciamos el procesamiento de la cadena original con su | inicial y el terminador || -->
	<xsl:template match="/">|<xsl:apply-templates select="/cfd:Comprobante"/>||</xsl:template>
	
	<!--  Aquí iniciamos el procesamiento de los datos incluidos en el comprobante -->
	<xsl:template match="cfd:Comprobante">
		<!-- Iniciamos el tratamiento de los atributos de comprobante -->
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@version"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@serie"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@folio"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@fecha"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@noAprobacion"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@anoAprobacion"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@tipoDeComprobante"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@formaDePago"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@condicionesDePago"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@subTotal"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@descuento"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@total"/></xsl:call-template>
		<!--
			Llamadas para procesar al los sub nodos del comprobante
		-->
		<xsl:apply-templates select="./cfd:Emisor"/>
		<xsl:apply-templates select="./cfd:Receptor"/>
		<xsl:apply-templates select="./cfd:Conceptos"/>
		<xsl:apply-templates select="./cfd:Impuestos"/>
		<xsl:apply-templates select="./cfd:Complemento"/>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Emisor -->
	<xsl:template match="cfd:Emisor">
		<!-- Iniciamos el tratamiento de los atributos del Emisor -->
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@rfc"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@nombre"/></xsl:call-template>
		<!--
			Llamadas para procesar al los sub nodos del comprobante
		-->
		<xsl:apply-templates select="./cfd:DomicilioFiscal"/>
		<xsl:if test="./cfd:ExpedidoEn">
			<xsl:call-template name="Domicilio">
				<xsl:with-param name="Nodo" select="./cfd:ExpedidoEn"/>
			</xsl:call-template>
		</xsl:if>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Receptor -->
	<xsl:template match="cfd:Receptor">
		<!-- Iniciamos el tratamiento de los atributos del Receptor -->
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@rfc"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@nombre"/></xsl:call-template>
		<!--
			Llamadas para procesar al los sub nodos del Receptor
		-->
		<xsl:call-template name="Domicilio"><xsl:with-param name="Nodo" select="./cfd:Domicilio"/></xsl:call-template>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Conceptos -->
	<xsl:template match="cfd:Conceptos">
		<!-- Llamada para procesar los distintos nodos tipo Concepto -->
		<xsl:for-each select="./cfd:Concepto"><xsl:apply-templates select="."/></xsl:for-each>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Impuestos -->
	<xsl:template match="cfd:Impuestos">
		<xsl:for-each select="./cfd:Retenciones/cfd:Retencion"><xsl:apply-templates select="."/></xsl:for-each>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@totalImpuestosRetenidos"/></xsl:call-template>
		<xsl:for-each select="./cfd:Traslados/cfd:Traslado"><xsl:apply-templates select="."/></xsl:for-each>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@totalImpuestosTrasladados"/></xsl:call-template>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Retencion -->
	<xsl:template match="cfd:Retencion">
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@impuesto"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@importe"/></xsl:call-template>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Traslado -->
	<xsl:template match="cfd:Traslado">
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@impuesto"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@tasa"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@importe"/></xsl:call-template>
	</xsl:template>

	<!-- Manejador de nodos tipo Complemento -->
	<xsl:template match="cfd:Complemento">
		<xsl:for-each select="./*"><xsl:apply-templates select="."/></xsl:for-each>
	</xsl:template>
	
	<!--
		Manejador de nodos tipo Concepto
	-->
	<xsl:template match="cfd:Concepto">
		<!-- Iniciamos el tratamiento de los atributos del Concepto -->
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@cantidad"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@unidad"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@noIdentificacion"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@descripcion"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@valorUnitario"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@importe"/></xsl:call-template>
		<!--
			Manejo de los distintos sub nodos de información aduanera de forma indistinta 
			a su grado de dependencia
		-->
		<xsl:for-each select=".//cfd:InformacionAduanera"><xsl:apply-templates select="."/></xsl:for-each>
		<!-- Llamada al manejador de nodos de Cuenta Predial en caso de existir -->
		<xsl:if test="./cfd:CuentaPredial"><xsl:apply-templates select="./cfd:CuentaPredial"/></xsl:if>
		<!-- Llamada al manejador de nodos de ComplementoConcepto en caso de existir -->
		<xsl:if test="./cfd:ComplementoConcepto"><xsl:apply-templates select="./cfd:ComplementoConcepto"/></xsl:if>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Información Aduanera -->
	<xsl:template match="cfd:InformacionAduanera">
		<!-- Manejo de los atributos de la información aduanera -->
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@numero"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@fecha"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@aduana"/></xsl:call-template>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Información CuentaPredial -->
	<xsl:template match="cfd:CuentaPredial">
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@numero"/></xsl:call-template>
	</xsl:template>
	
	<!-- Manejador de nodos tipo ComplementoConcepto -->
	<xsl:template match="cfd:ComplementoConcepto">
		<xsl:for-each select="./*"><xsl:apply-templates select="."/></xsl:for-each>
	</xsl:template>
	
	<!-- Manejador de nodos tipo domicilio fiscal -->
	<xsl:template match="cfd:DomicilioFiscal">
		<!-- Iniciamos el tratamiento de los atributos del Domicilio Fiscal -->
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@calle"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@noExterior"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@noInterior"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@colonia"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@localidad"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="./@referencia"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@municipio"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@estado"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@pais"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="./@codigoPostal"/></xsl:call-template>
	</xsl:template>
	
	<!-- Manejador de nodos tipo Domicilio -->
	<xsl:template name="Domicilio">
		<xsl:param name="Nodo"/>
		<!-- Iniciamos el tratamiento de los atributos del Domicilio  -->
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@calle"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@noExterior"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@noInterior"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@colonia"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@localidad"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@referencia"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@municipio"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@estado"/></xsl:call-template>
		<xsl:call-template name="Requerido"><xsl:with-param name="valor" select="$Nodo/@pais"/></xsl:call-template>
		<xsl:call-template name="Opcional"><xsl:with-param name="valor" select="$Nodo/@codigoPostal"/></xsl:call-template>
	</xsl:template>
	
</xsl:stylesheet>
